异常
java.lang.Throwable 是 Java 语言中所有错误或异常的超类。
1. Error
Error 是 Throwable的子类,用于指示合理的应用程序不应该试图捕获的严重问题。例如 VirtualMachineError
2. Exception
Exception可以分为两大类,运行时异常和编译时异常。运行时异常包括 RuntimeException 和它的子类。编译时异常是除了 RuntimeException 之外的异常。出编译时异常都会要求加上 try…catch或者 throws
异常的处理
finally 和 return
当 finally 里面有 return,那么结果就是 finally 中的
当 finally 里面没有 return,那么结果就是返回 try 或者 catch 中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| package com.itguigu.com;
public class TestFinallyReturn { public static void main(String[] args) { System.out.println(getNum()); System.out.println(getNum2()); } public static int getNum() { int i=10; try { i=20; return i; } catch (Exception e) { i=30; return i; }finally { i=40; return i; } } public static int getNum2(){ int i=10; try { i=20; return i; } catch (Exception e) { i=30; return i; }finally { i=40; } } }
|
throws
用在声明一个方法的时候,明确声明该方法可能抛出 xx 异常。说明该异常在该方法中没有 try…catch,由调用者处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| package com.itguigu.com;
public class TestThrows { public static void main(String[] args) { try { divide(10, 2); } catch (ArithmeticException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } public static int divide(int a, int b) throws ArithmeticException, Exception{ return a/b; } }
|
throws 与方法重写:子类抛出的异常类型应该小于等于父类抛出的异常类型。
方法重写的要求学习完毕(两同两小一大)
方法名:必须相同
行参列表:必须相同
返回值类型
基本数据类型和 void:必须相同
引用数据类型:小于等于父类
权限修饰符:大于等于父类
抛出的异常列表类型:小于等于父类
throw
throw 的作用是用于主动抛出异常。如果没有 try…catch,他可以代替 return 结束当前方法。但是无法返回正常的结果。只能带回 “异常对象”。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| package com.itguigu.com;
public class TestThorw { public static void main(String[] args) { try { test(); } catch (Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); } } public static void test() throws Exception { throw new Exception("运行时异常"); } }
|
自定义异常
自定义异常的要求:
要将一个变成 “异常类型”,那么这个类必须继承 Throwable,或者继承它的子类。
自定义异常对象只能由 throw 语句手动抛出。然后可以加上 try…catch 或者使用 thrors 抛给上层。
建议自定义异常,添加两个装饰器。
3.1 无参构造尽量保留
3.2 有参构造。异常类型(String message),可以为 message 赋值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| package com.itguigu.com;
public class TestDefineException { public static void main(String[] args) { try { test(); } catch (UsernameOrPassword e) { System.out.println(e.getMessage()); } } public static void test() throws UsernameOrPassword { throw new UsernameOrPassword("用户名或密码错误"); } }
class UsernameOrPassword extends Exception{ public UsernameOrPassword() { super(); }
public UsernameOrPassword(String message) { super(message); } }
|